package concreto.neuronio;

import comportamento.neuronio.INeuronio;
import comportamento.neuronio.INeuronioAbstrato;

/**
 * Neuronio proposto por McCaullagh e Pitts
 * 
 * @author rgomes
 *
 */
public class NeuronioMP extends INeuronioAbstrato implements INeuronio{

	public NeuronioMP(double limiar) {
		super();
		super.limiar = limiar;
	}

	public double estimular(double[] estimulo) {

		return this.resposta(estimulo);
	}

	public void selecionarFuncaoAtivacao(int funcao) {

		super.selecionarFuncaoAtivacao(funcao);
	}

	@Override
	public double[] ponderarEstimulos(double[] estimulos) {

		this.estimulos = estimulos;
		int quantidadeEntradas = estimulos.length;

		double[] resultados = new double[quantidadeEntradas]; 
		geraPesosConexoes(quantidadeEntradas);

		for(int i = 0; i < quantidadeEntradas; i ++) {
			resultados[i] = estimulos[i] * this.wk[i];
		}

		return resultados;
	}    

	@Override
	public void calcularUk(double[] vetorPesosConexao) {

		this.uk = 0.0;

		for(double valor : vetorPesosConexao) {
			this.uk += valor;
		}
	}


	@Override
	public void geraPesosConexoes(int quantidadeEntradas) {

		this.wk = new double[quantidadeEntradas];

		for(int i = 0; i < quantidadeEntradas; i++) {
			this.wk[i] = 1;
		}
	}


	@Override
	public double resposta(double[] estimulos) {

		calcularUk(ponderarEstimulos(estimulos));
		this.y = this.funcaoAtivacao.estimularNeuronio(this.uk, this.valorLimiar());

		return this.y;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {

		StringBuffer neuronio = new StringBuffer("");

		String estimulos = "[";
		String pesos = "[";

		if(this.estimulos != null && this.estimulos.length > 0) {

			for(double e : this.estimulos) {
				estimulos = estimulos.concat(e + ", ");
			}
			estimulos = estimulos.substring(0, estimulos.length()-2).concat("]");
		} else {
			estimulos = estimulos.concat(" ]");
		}

		if(this.wk != null && this.wk.length > 0) {

			for(double e : this.wk) {
				pesos = pesos.concat(e + ", ");
			}
			pesos = pesos.substring(0, pesos.length()-2).concat("]");
		} else {
			pesos = pesos.concat(" ]");
		}

		neuronio.append("\nEstimulos: " + estimulos);
		neuronio.append("\nPesos das conexões: " +  pesos);
		neuronio.append("\nUk: " +  super.uk);
		neuronio.append("\ny: " + super.y);
		neuronio.append("\nLimiar: " + this.limiar);
		neuronio.append("\nBias: " + this.bk);

		return neuronio.toString();
	}

}
